package xml;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import service.SerializadorItemListaPrecios;

import bean.vo.ItemListaPreciosVO;
import bean.vo.ListaPreciosVO;
import bean.vo.ProveedorVO;

public class SerializadorListaPrecios {

	public static ListaPreciosVO deserializar(Node nodoLista) throws Exception {
		ListaPreciosVO listaPrecios = new ListaPreciosVO();
		
		if (nodoLista.getNodeName() != Constantes.LISTA_PRECIOS) {
			throw new Exception("Error - nodo lista invalido");
		}
		
		listaPrecios.setNumeroLista(Integer.parseInt(XmlUtil.getAttributeValue(nodoLista, Constantes.NUMERO)));
		String tipoLista = XmlUtil.getAttributeValue(nodoLista, Constantes.TIPO);
		listaPrecios.setListaDeOfertas(tipoLista == Constantes.TIPO_OFERTA);
		
		Node nodoProveedor = XmlUtil.getChildNodeWithName(nodoLista, Constantes.PROVEEDOR);
		ProveedorVO proveedor = SerializadorProveedor.deserializar(nodoProveedor);
		listaPrecios.setProveedor(proveedor);
		
		Node nodoVigencia = XmlUtil.getChildNodeWithName(nodoLista, Constantes.VIGENCIA);
		SerializadorListaPrecios.parsearNodoVigencia(nodoVigencia, listaPrecios);
		
		Node nodoListaReemplazada = XmlUtil.getChildNodeWithName(nodoLista, Constantes.REEMPLAZA);
		String tipoReemplazada = XmlUtil.getAttributeValue(nodoListaReemplazada, Constantes.TIPO);
		if (tipoReemplazada != null && tipoReemplazada != "" && tipoReemplazada != tipoLista) {
			throw new Exception("Error - Una lista de precios de tipo " + tipoLista + " no puede reemplazar a una de tipo " + tipoReemplazada);
		}
		
		String numeroRemplazada = XmlUtil.getAttributeValue(nodoListaReemplazada, Constantes.NUMERO);;
		if (numeroRemplazada != null && numeroRemplazada != "") {
			listaPrecios.setNumeroListaReemplazada(Integer.parseInt(numeroRemplazada));
		}
		
		NodeList items = XmlUtil.getChildNodeWithName(nodoLista, Constantes.RODAMIENTOS).getChildNodes();
		for (int i = 0; i < items.getLength(); i++) {
			Node nodoItem = items.item(i);
			if (nodoItem.getNodeName() == Constantes.ITEM) {
				ItemListaPreciosVO itemVo = SerializadorItemListaPrecios.deserializar(nodoItem);
				listaPrecios.agregarItem(itemVo);
			}
		}
		
		return listaPrecios;
	}
	
	private static void parsearNodoVigencia(Node nodoVigencia, ListaPreciosVO lista) throws ParseException {
		String fecha = XmlUtil.getChildNodeValueWithName(nodoVigencia, Constantes.FECHA);
		String termino = XmlUtil.getChildNodeValueWithName(nodoVigencia, Constantes.TERMINO);
		Date fechaDesde = XmlUtil.dateFormat.parse(fecha);
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(fechaDesde);
		cal.add(Calendar.DATE, Integer.parseInt(termino));
		Date fechaHasta = cal.getTime();
		
		lista.setFechaEmision(fechaDesde);
		lista.setFechaCaducidad(fechaHasta);
	}
	
}
